﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraBars;


namespace GUI2.Controler
{
    public partial class FrmSanpham : GUI2.Controler.FrmBaseControler
    {
        public FrmSanpham()
        {
            InitializeComponent();
        }

        DAL.TruyXuatDB DB = new DAL.TruyXuatDB();
        BLL2.SuLyAnh sla = new BLL2.SuLyAnh();

        #region Method
        private string TaoMaSanpham()
        {
            string MaSPHead = "SP";
            string MaSPFoot = (DB.LayDuLieu("select SPMA from Sanpham").Rows.Count + 1).ToString();
            int MaSPFootInt = Convert.ToInt32(MaSPFoot);
            string MaSPNew = MaSPHead + MaSPFoot;
            while (MaSPNew.Length < 6)
            {
                MaSPHead += "0";
                MaSPNew = MaSPHead + MaSPFoot;
            }

            int Thamso = 1;
            string[] Bien = new string[Thamso];
            object[] Giatri = new object[Thamso];
            Bien[0] = "@SPMa";
            Giatri[0] = MaSPNew;
            while (DB.LayDuLieu("select SPMA from sanpham where spma = @spma", Bien, Giatri, Thamso).Rows.Count > 0)
            {
                MaSPFootInt += 1;
                MaSPNew = MaSPHead + MaSPFootInt.ToString();
                while (MaSPNew.Length < 6)
                {
                    MaSPHead += "0";
                    MaSPNew = MaSPHead + MaSPFootInt.ToString();
                }
                Giatri[0] = MaSPNew;
            }
            return MaSPNew;
        }

        private void LoadLoaiHang()
        {
            DataTable DT = new DataTable();
            DT = DB.LayDuLieu("select * from loaihang");
            cbxLHMa.DataSource = DT;
            cbxLHMa.DisplayMember = "LHTEN"; ;
            cbxLHMa.ValueMember = "LHMA";
            cbxLHMa.Text = null;
        }

        private void LoadNSX()
        {
            DataTable DT = new DataTable();
            DT = DB.LayDuLieu("select nsxma,nsxten from nhansanxuat");
            cbxSPNSX.DataSource = DT;
            cbxSPNSX.DisplayMember = "nsxten"; ;
            cbxSPNSX.ValueMember = "nsxma";
            cbxSPNSX.Text = null;
        }

        private void LoadDsSp()
        {
            _dtb = DB.LayDuLieu("select sp.spma, sx.nsxten, lh.lhten, sp.spten, sp.spgianhap, sp.spgiaban, sp.spsoluong, sp.sphinhanh from sanpham as sp, loaihang as lh, nhansanxuat as sx, DUOC_SX_TU_NSX as dsx where sp.lhma =lh.lhma and sp.spma=dsx.spma and dsx.nsxma = sx.nsxma");

            if (_dtb != null)
            {
                gcSanpham.DataSource = _dtb;
                gvSanpham.BestFitColumns();
                ClearDataBindings();
                DataBindingControl();
            }
        }
        #endregion

        #region Overrides
        protected override void PerformRefresh()
        {
            LoadData();
            ReadOnlyControl();

            txtTuKhoa.Text = null;
            lblKetqua.Text = null;
            base.PerformRefresh();
        }

        protected override void LoadData()
        {
            LoadLoaiHang();
            LoadNSX();
            LoadDsSp();

            base.LoadData();
        }

        protected override void PerformAdd()
        {
            txtSPMa.Text = TaoMaSanpham();
            ResetInput();
            base.PerformAdd();
            txtSPSoLuongThem.Enabled = false;
            txtSPSoLuong.Enabled = true;
        }

        protected override void PerformEdit()
        {
            var SPMa = gvSanpham.GetFocusedRowCellValue("spma");
            if (SPMa == null)
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Sữa thông tin sản phẩm", "Chọn sản phẩm để sữa trong danh sách bên dưới", 1);
                return;
            }

            base.PerformEdit();
            txtSPSoLuongThem.Enabled = true;
            txtSPSoLuong.Enabled = false;
        }

        protected override void PerformDelete()
        {
            var SPTen = gvSanpham.GetFocusedRowCellValue("spten");
            if (SPTen == null)
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Xóa sản phẩm", "Chọn sản phẩm để xóa trong danh sách bên dưới", 1);
                return;
            }

            DialogResult oki = XtraMessageBox.Show("Có muốn xóa " + SPTen + " không?", "", MessageBoxButtons.YesNo);

            if (oki == DialogResult.Yes)
            {
                int Thamso = 1;
                string[] Bien = new string[Thamso];
                object[] Giatri = new object[Thamso];
                Bien[0] = "@SPMA";
                Giatri[0] = gvSanpham.GetFocusedRowCellValue("spma").ToString();
                try
                {
                    DB.Update(@" 
                                BEGIN TRY
                                    BEGIN TRAN
		                                  delete DUOC_SX_TU_NSX where SPMA =@SPMA ; 
		                                  delete SANPHAM where SPMA =@SPMA
		                                  COMMIT
                                END TRY
                                BEGIN CATCH
                                           ROLLBACK
                                END CATCH",
                                Bien, Giatri, Thamso);
                    ThongBao.FrmThongBaoOk.TaoThongBaoOk("Xóa sản phẩm", "Xóa thành công", 4);
                }
                catch (Exception)
                {
                    ThongBao.FrmThongBaoOk.TaoThongBaoOk("Xóa sản phẩm", "Không thể xóa! Dữ liệu đang được sử dụng", 4);
                }
                LoadData();
            }

            base.PerformDelete();
        }

        string MaSPCurent = "";
        protected override void PerformSave()
        {
            if (!ValidInput()) return;
            switch (_state)
            {
                case State.Add:
                    int Thamso = 7;
                    string[] Bien = new string[Thamso];
                    object[] Giatri = new object[Thamso];
                    Bien[0] = "@SPMa";
                    Bien[1] = "@LHMa";
                    Bien[2] = "@SPTen";
                    Bien[3] = "@SPGiaNhap";
                    Bien[4] = "@SPGiaBan";
                    Bien[5] = "@SPSoLuong";
                    Bien[6] = "@SPDonViTinh";

                    Giatri[0] = txtSPMa.Text;
                    Giatri[1] = cbxLHMa.SelectedValue;
                    Giatri[2] = txtSPTen.Text;
                    Giatri[3] = txtSPGiaNhap.EditValue;
                    Giatri[4] = txtSPGiaBan.EditValue;
                    Giatri[5] = txtSPSoLuong.EditValue;
                    Giatri[6] = cbxSPDonvitinh.Text;
                    if (DB.Update("insert into sanpham (spma,lhma,spten,SPGiaNhap, spgiaban,SPSoLuong,SPDonViTinh) values (@SPMa,@LHMa,@SPTen,@SPGiaNhap, @SPGiaBan,@SPSoLuong,@SPDonViTinh)", Bien, Giatri, Thamso) > 0)
                    {
                        int thamso = 2;
                        string[] bien = new string[thamso];
                        object[] giatri = new object[thamso];
                        bien[0] = "@spma";
                        bien[1] = "@nsxma";
                        giatri[0] = txtSPMa.Text;
                        giatri[1] = cbxSPNSX.SelectedValue;
                        if (DB.Update("insert into DUOC_SX_TU_NSX (spma, nsxma) values (@spma, @nsxma)", bien, giatri, thamso) > 0)
                        {

                        }
                        ThongBao.FrmThongBaoOk.TaoThongBaoOk("Thêm sản phẩm", "Thêm sản phẩm thành công", 4);
                        LoadData();
                    }
                    else
                    {
                        ThongBao.FrmThongBaoOk.TaoThongBaoOk("Thêm sản phẩm", "Một số thông tin không hợp lệ!", 2);
                    }
                    int UpAnh = DB.Update(txtSPMa.Text, sla.Hinh_Mang(ptcSPHinhAnh));
                    MaSPCurent = txtSPMa.Text;
                    txtSPMa.Text = TaoMaSanpham();
                    ResetInput();
                    break;

                case State.Edit:
                    int ThamsoEdit = 7;
                    string[] BienEdit = new string[ThamsoEdit];
                    object[] GiatriEdit = new object[ThamsoEdit];
                    BienEdit[0] = "@SPMa";
                    BienEdit[1] = "@LHMa";
                    BienEdit[2] = "@SPTen";
                    BienEdit[3] = "@SPGiaNhap";
                    BienEdit[4] = "@SPGiaBan";
                    BienEdit[5] = "@SPSoLuong";
                    BienEdit[6] = "@SPDonViTinh";

                    GiatriEdit[0] = txtSPMa.Text;
                    GiatriEdit[1] = cbxLHMa.SelectedValue;
                    GiatriEdit[2] = txtSPTen.Text;
                    GiatriEdit[3] = txtSPGiaNhap.EditValue;
                    GiatriEdit[4] = txtSPGiaBan.EditValue;
                    GiatriEdit[5] = Convert.ToInt32(txtSPSoLuong.EditValue) + Convert.ToInt32(txtSPSoLuongThem.EditValue);
                    GiatriEdit[6] = cbxSPDonvitinh.Text;
                    if (DB.Update("update sanpham set lhma=@LHMa,spten=@SPTen,SPGiaNhap=@SPGiaNhap, spgiaban=@SPGiaBan,SPSoLuong=@SPSoLuong,SPDonViTinh=@SPDonViTinh", BienEdit, GiatriEdit, ThamsoEdit) > 0)
                    {
                        
                        DB.Update(txtSPMa.Text, sla.Hinh_Mang(ptcSPHinhAnh));
                        ThongBao.FrmThongBaoOk.TaoThongBaoOk("Cập nhật sản phẩm", "Cập nhật thông tin sản phẩm thành công", 4);
                        LoadData();
                    }
                    else
                    {
                        ThongBao.FrmThongBaoOk.TaoThongBaoOk("Cập nhật sản phẩm", "Không thể truy xuất dữ liệu!", 2);
                    }
                    ChangeStatus(); ReadOnlyControl();
                    PerformRefresh();

                    break;

                default:
                    break;
            }
            base.PerformSave();
        }

        protected override bool ValidInput()
        {
            if (txtSPTen.Text=="")
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Lổi nhập liệu", "Chưa nhập tên sản phẩm", 1);
                return false;   
            }

            if (cbxLHMa.Text == "") 
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Lổi nhập liệu", "Chưa chọn loại hàng", 1);
                return false;
            }

            if (cbxSPNSX.Text == "")
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Lổi nhập liệu", "Chưa chọn nhà sản suất", 1);
                return false;
            }

            if (cbxSPDonvitinh.Text == "")
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Lổi nhập liệu", "Chưa chọn đơn vị tính", 1);
                return false;
            }

            if (Convert.ToInt32(txtSPGiaBan.EditValue) == 0)
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Lổi nhập liệu", "Chưa nhập giá bán", 1);
                return false;
            }

            if (Convert.ToInt32(txtSPSoLuong.EditValue) == 0)
            {
                ThongBao.FrmThongBaoOk.TaoThongBaoOk("Lổi nhập liệu", "Chưa nhập số lượng", 1);
                return false;
            }

            return base.ValidInput();
        }


        private void ResetInput()
        {
            txtSPTen.Text = null;
            cbxLHMa.Text = null;
            cbxSPDonvitinh.Text = null;
            cbxSPNSX.Text = null;
            txtSPGiaBan.EditValue = 0;
            txtSPGiaNhap.EditValue = 0;
            txtSPSoLuong.EditValue = 0;
            txtSPSoLuongThem.EditValue = 0;
        }

        protected override void ClearDataBindings()
        {
            txtSPMa.DataBindings.Clear();
            txtSPTen.DataBindings.Clear();
            txtSPGiaNhap.DataBindings.Clear();
            txtSPGiaBan.DataBindings.Clear();
            txtSPSoLuong.DataBindings.Clear();
            cbxSPNSX.DataBindings.Clear();
            cbxLHMa.DataBindings.Clear();
            base.ClearDataBindings();
        }

        protected override void DataBindingControl()
        {
            txtSPMa.DataBindings.Add("Text", _dtb, "spma");
            txtSPTen.DataBindings.Add("Text", _dtb, "spten");
            txtSPGiaNhap.DataBindings.Add("Text", _dtb, "spgianhap");
            txtSPGiaBan.DataBindings.Add("Text", _dtb, "spgiaban");
            txtSPSoLuong.DataBindings.Add("Text", _dtb, "spsoluong");
            cbxSPNSX.DataBindings.Add("Text", _dtb, "nsxten");
            cbxLHMa.DataBindings.Add("Text", _dtb, "lhten");

            base.DataBindingControl();
        }

        protected override void ReadOnlyControl(bool isReadOnly = true)
        {
            cbxSPNSX.Enabled = !isReadOnly;
            cbxLHMa.Enabled = !isReadOnly;
            cbxSPDonvitinh.Enabled = !isReadOnly;
            txtSPMa.Enabled = !isReadOnly;
            txtSPGiaBan.Enabled = !isReadOnly;
            txtSPGiaNhap.Enabled = !isReadOnly;
            txtSPSoLuong.Enabled = !isReadOnly;
            txtSPTen.Enabled = !isReadOnly;
            btnMainPicture.Enabled = !isReadOnly;
            txtSPSoLuongThem.Enabled = !isReadOnly;
            gcSanpham.Enabled = isReadOnly;

            base.ReadOnlyControl(isReadOnly);
        }
        #endregion

        private void FrmSanpham_Load(object sender, EventArgs e)
        {
            PerformRefresh();
            ReadOnlyControl();
            txtSPSoLuongThem.Enabled = false;
            ChangeStatus();
        }

        private void btnMainPicture_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Chọn file ảnh từ máy";
            ofd.Filter = "File ảnh là được JPG Files(*.JPG)|*.JPG|GIF Files(*.GIF)|*.GIF";
            if (ofd.ShowDialog(this) == DialogResult.OK)
            {
                ptcSPHinhAnh.ImageLocation = ofd.FileName;
            }
        }

        private void gvSanpham_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            BLL2.SuLyAnh sla = new BLL2.SuLyAnh();
            try
            {
                ptcSPHinhAnh.Image = sla.Mang_Hinh((byte[])gvSanpham.GetFocusedRowCellValue("sphinhanh"));
                MaSPCurent = gvSanpham.GetFocusedRowCellValue("spma").ToString();
            }
            catch (Exception)
            {
                this.ptcSPHinhAnh.Image = global::GUI2.Properties.Resources.NoImage;
            }
        }

        private void btnTim_Click(object sender, EventArgs e)
        {
            if (txtTuKhoa.Text.Trim() == "") { lblKetqua.Text = ""; LoadDsSp(); return; }
            DataTable Timkiem = DB.LayDuLieu("select sp.spma, sx.nsxten, lh.lhten, sp.spten, sp.spgianhap, sp.spgiaban, sp.spsoluong, sp.sphinhanh from sanpham as sp, loaihang as lh, nhansanxuat as sx, DUOC_SX_TU_NSX as dsx where sp.lhma =lh.lhma and sp.spma=dsx.spma and dsx.nsxma = sx.nsxma");
            gcSanpham.DataSource = BLL.TimKiem.TimKiemTuongDoi_(Timkiem, txtTuKhoa.Text);
            lblKetqua.Text = "Có " + gvSanpham.RowCount + " kết quả tìm thấy.";
        }

        private void txtTuKhoa_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode.ToString() == "Return")
            {
                btnTim_Click(null, null);
            }
        }
    }
}